/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */

package submissao;

import java.lang.Integer;
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.sql.Statement;
import java.util.ArrayList;
import javax.swing.JOptionPane;

/**
 *
 * @author Valter
 */
public class ConexaoBD {
    private Connection connection;
    private Statement statement;
    
        public ConexaoBD() {
            String driver = "com.mysql.jdbc.Driver"; //Classe do driver JDBC
            String banco = "submissao"; //Nome do Banco criado
            String host = "localhost"; //Maquina onde está o banco
            String str_conn = "jdbc:mysql://" + host + ":3306/" + banco; //URL de conexão
            String usuario = "root"; //Usuário do banco
            String senha = "root"; //Senha de conexão


        try {
            Class.forName(driver).newInstance();
            connection = DriverManager.getConnection(str_conn, usuario, senha);

            statement = connection.createStatement();
        } catch (ClassNotFoundException ex) {
            JOptionPane.showMessageDialog(null, "O carregamento do driver não foi possível!", "Driver inválido!", JOptionPane.ERROR_MESSAGE);
        } catch (SQLException ex) {
            JOptionPane.showMessageDialog(null, "Erro ao conectar com SQL!", "Falha com SQL", JOptionPane.ERROR_MESSAGE);
        } catch (Exception e) {
            JOptionPane.showMessageDialog(null, "Erro de conexão com banco de dados", "Erro com SQL", JOptionPane.ERROR_MESSAGE);
        }
    }

        public boolean cadastrarTrabalho(Trabalho aTrabalho){
            String sQuery = "insert into submissao.trabalho (area, titulo, resumo, conteudo, categoria) values ('" +aTrabalho.getsArea()+"', '"+aTrabalho.getsTitulo()+"', '"+aTrabalho.getsResumo()+"', '"+aTrabalho.getsConteudo()+"', "+aTrabalho.getiCategoria()+")";

            try{
                statement.execute(sQuery);
            }catch(SQLException s){
                return false;
            }

            return true;
        }

        /**
         * Cadastra uma palavra chave ao ultimo trabalho inserido no sistema
         * @param aPalavra Palavra-chave que será associada ao trabalho
         * @return Retorna true se operação realizada com sucesso, false caso contrário
         */
        public boolean cadastrarPalavraChave(Trabalho aTrabalho, String aPalavra){

            String sQuery = "insert into submissao.palavrachave values ("+aTrabalho.getiIdTrabalho()+", '"+ aPalavra +"')";

            try{
                statement.execute(sQuery);

            }catch(SQLException s){
                s.printStackTrace();
            }
            return true;
        }

        /**
         * Associa uma palavra-chave ao trabalho que possui o id que esta sendo informado ao método
         * @param aIdTrabalho O ID do trabalho que acabou de ser inserido
         * @param aPalavra A palavra-chave que foi associada ao trabalho
         * @return Retorna true se a operação foi efetuada com sucesso, false caso contrário
         */
        public boolean cadastrarPalavraChaveAoTrabalho(int aIdTrabalho, String aPalavra){
            ResultSet rs = null;

            String sQuery = "insert into submissao.palavrachave values (" + aIdTrabalho + ", '"+ aPalavra +"')";

            try{
                statement.execute(sQuery);
                rs.close();

            }catch(SQLException s){
                return false;
            }
            return true;
        }

        /**
         * Cadastrar um participante no sistema
         * @param aParticipante Objeto participante que será inserido no sistema
         * @return Retorna true se a operação foi efetuada com sucesso, false caso contrário
         */
        public boolean cadastrarParticipante(Participante aParticipante){
            String[] sNome = aParticipante.getsNome().split(" ");
            String sNomeInicial = sNome[0];
            String sNomeMeio="";

            for (int j = 1; j < sNome.length-1; j++){
                sNomeMeio += sNome[j] + " ";
            }
            
            String sNomeFinal = "";

            if (sNomeFinal.length() > 0){
                sNomeFinal = sNome[sNome.length-1];
            }

            String sQuery = "insert into submissao.participante values ('"+aParticipante.getsEmail()+"', '"+sNomeInicial+"', '"+sNomeMeio+"', '"+sNomeFinal+"', '"+aParticipante.getsEndereco()+"', "+aParticipante.getiNumeroCasa()+",  '"+aParticipante.getsAfiliacao()+"', '"+aParticipante.getsPais()+"', "+aParticipante.getsTelefone()+", '"+aParticipante.getsArea()+"', "+aParticipante.isbPesquisador()+", "+aParticipante.isbAvaliador()+", "+aParticipante.isbEspecialista()+")";
            try{
                statement.execute(sQuery);

            }catch(SQLException s){
                return false;
            }
            return true;
        }


        /**
         * Cadastra um autor ao último trabalho inserido no sistema
         * @return Retorna true se a operação foi efetuada com sucesso, false caso contrário
         */
        public boolean cadastrarAutorAoTrabalho(String aAutor){

            String sQuery = "insert into submissao.palavrachave values (LAST_INSERT_ID(), '"+ aAutor +"')";

            try{
                statement.execute(sQuery);

            }catch(SQLException s){
                s.printStackTrace();
            }
            return true;
        }

        /**
         * Consulta por todos os trabalhos existem no banco de dados
         * @return Retorna um ArrayList de objetos do tipo 'Trabalho'
         */
        public ArrayList consultarTodosTrabalhos(){
            ResultSet rs = null;
            ArrayList<Trabalho> lista = new ArrayList<Trabalho>();

            String sQuery = "select * from trabalho";

            try{
                statement.execute(sQuery);
                rs = statement.getResultSet();
                
                while(rs.next()){
                    Trabalho trabalho = new Trabalho();
                    trabalho.setiIdTrabalho(rs.getInt("idTrabalho"));
                    trabalho.setsArea(rs.getString("area"));
                    trabalho.setsTitulo(rs.getString("titulo"));
                    trabalho.setsResumo(rs.getString("resumo"));
                    trabalho.setsConteudo(rs.getString("conteudo"));
                    trabalho.setiCategoria(rs.getInt("categoria"));

                    lista.add(trabalho);
                }
                rs.close();

            }catch(SQLException s){
                s.printStackTrace();
            }

            return lista;
        }

        /**
         * Consulta por trabalhos que estejam em determinada área de pesquisa, essa é passada por parâmetro
         * @param aArea A área a qual se queira pesquisar
         * @return Retorna um ArrayList de trabalho que estejam na área de pesquisa que foi passada ao método
         */
        public ArrayList consultarPorArea(String aArea){
            ResultSet rs = null;
            ArrayList<Trabalho> lista = new ArrayList<Trabalho>();

            String sQuery = "select * from trabalho where area like '%" + aArea +"%'";

            try{
                statement.execute(sQuery);
                rs = statement.getResultSet();

                while(rs.next()){
                    Trabalho trabalho = new Trabalho();
                    trabalho.setiIdTrabalho(rs.getInt("idTrabalho"));
                    trabalho.setsArea(rs.getString("area"));
                    trabalho.setsTitulo(rs.getString("titulo"));
                    trabalho.setsResumo(rs.getString("resumo"));
                    trabalho.setsConteudo(rs.getString("conteudo"));
                    trabalho.setiCategoria(rs.getInt("categoria"));

                    lista.add(trabalho);
                }
                rs.close();

            }catch(SQLException s){
                s.printStackTrace();
            }

            return lista;
        }

        /**
         * Consulta por trabalhos que estejam em determinada categoria passada por parâmetro
         * @param aCategoria A categoria a qual quer saber os seus trabalhos
         * @return ArrayList com os trabalhos que estejam naquela categoria passada para o método
         */
        public ArrayList consultarPorCategoria(int aCategoria){
            ResultSet rs = null;
            ArrayList<Trabalho> lista = new ArrayList<Trabalho>();

            String sQuery = "select * from trabalho where categoria = " + aCategoria +"";

            try{
                statement.execute(sQuery);
                rs = statement.getResultSet();

                while(rs.next()){
                    Trabalho trabalho = new Trabalho();
                    trabalho.setiIdTrabalho(rs.getInt("idTrabalho"));
                    trabalho.setsArea(rs.getString("area"));
                    trabalho.setsTitulo(rs.getString("titulo"));
                    trabalho.setsResumo(rs.getString("resumo"));
                    trabalho.setsConteudo(rs.getString("conteudo"));
                    trabalho.setiCategoria(rs.getInt("categoria"));

                    lista.add(trabalho);
                }
                rs.close();

            }catch(SQLException s){
                s.printStackTrace();
            }

            return lista;
        }

        /**
         * Retorna um ArrayList de objetos do tipo 'Trabalho' que tenham em sua palavra chave a string passada por parâmetro
         * @param aPalavra Palavra-chave que se procurará nos trabalhos
         * @return ArrayList com objetos de trabalhos
         */
        public ArrayList consultarTrabalhosPorPalavraChave(String aPalavra){
            ResultSet rs = null;
            ArrayList<Integer> lista = new ArrayList<Integer>();

            String sQuery = "select idTrabalho from submissao.palavrachave where palavra like '%"+ aPalavra +"%'";
            try{
                statement.execute(sQuery);
                rs = statement.getResultSet();

                while(rs.next()){
                    lista.add(rs.getInt("idTrabalho"));
                }
                rs.close();

            }catch(SQLException s){
                s.printStackTrace();
            }

            return lista;
        }

        /**
         * Retorna um trabalho passando por parâmetro o seu id
         * @param aIdTrabalho ID do trabalho que se queira saber suas informações
         * @return Retorna um objeto 'Trabalho' com as informações do mesmo
         */
        public Trabalho consultarTrabalho(int aIdTrabalho){
            ResultSet rs = null;
            Trabalho trabalho = new Trabalho();

            String sQuery = "select * from trabalho where idTrabalho=" + aIdTrabalho + "";

            try{
                statement.execute(sQuery);
                rs = statement.getResultSet();

                while(rs.next()){
                    trabalho.setiIdTrabalho(rs.getInt("idTrabalho"));
                    trabalho.setsArea(rs.getString("area"));
                    trabalho.setsTitulo(rs.getString("titulo"));
                    trabalho.setsResumo(rs.getString("resumo"));
                    trabalho.setsConteudo(rs.getString("conteudo"));
                    trabalho.setiCategoria(rs.getInt("categoria"));
                }
                rs.close();

            }catch(SQLException s){
                s.printStackTrace();
            }

            return trabalho;

        }

        /**
         * Retorna um vetor com os emails de todos os participante que tenham em seu nome (inicial, meio, final) a string passada por parâmetro
         * @param aParticipante Nome do participante
         * @return ArrayList com os emails dos participantes achados na busca realizada
         */
        public ArrayList consultarParticipante(String aParticipante){
            ResultSet rs = null;
            String sEmail;
            ArrayList<String> lista = new ArrayList<String>();

            String sQuery = "select email from submissao.participante where nomeInicial like '%"+aParticipante+"%' or nomeMeio like '%"+aParticipante+"%' or nomeFinal like '%"+aParticipante+"%'";
            try{
                statement.execute(sQuery);
                rs = statement.getResultSet();

                while(rs.next()){
                    sEmail = rs.getString("email");
                    if(!lista.contains(sEmail))
                        lista.add(sEmail);
                }
                rs.close();

            }catch(SQLException s){
                s.printStackTrace();
            }

            return lista;
        }

        /**
         * Consulta pelo maior valor no atributo 'ordem', que este por sua vez significa quem é o autor principal e os demais autores de determinado trabalho
         * @param aIdTrabalho Passando o id do trabalho
         * @return Retorna o valor da maior valor de ordem de determinado trabalho
         */
        public int consultarMaiorOrdemAutorTrabalho(int aIdTrabalho){
            ResultSet rs = null;
            int iMaiorOrdem = 0;

            String sQuery = "select MAX(ordem) from submissao.autortrabalho where idTrabalho = "+ aIdTrabalho+";";
            try {
                statement.execute(sQuery);
                rs = statement.getResultSet();

                if (rs.next()) {
                    iMaiorOrdem = rs.getInt(1);
                }

                rs.close();

            } catch (SQLException s) {
                s.printStackTrace();
            }
            
            return iMaiorOrdem;

        }

        public boolean associarTrabalhoAoAutor(int aIdTrabalho, String aEmail){
            int iOrdem = consultarMaiorOrdemAutorTrabalho(aIdTrabalho);
            // consulto pelo maior id daquele trabalho e adiciono mais um em sua ordem
            iOrdem++;
            String sQuery = "insert into submissao.autortrabalho values ("+aIdTrabalho+", '"+aEmail+"', "+iOrdem+");";

            try {
                statement.execute(sQuery);

            } catch (SQLException s) {
                s.printStackTrace();
            }
            return true;
        }

        /**
         * Consulta o ID do trabalho que acabou de ser inserido no banco de dados
         * @return ID gerado pelo banco de dados do trabalho que acabou de ser inserido no mesmo
         */
        public int consultarIdTrabalho(){
            ResultSet rs = null;
            int iID = -1;

            String sQuery = "select idTrabalho from submissao.trabalho where idTrabalho = LAST_INSERT_ID()";
            try {
                statement.execute(sQuery);
                rs = statement.getResultSet();

                if (rs.next()) {
                    iID = rs.getInt("idTrabalho");
                }
                rs.close();

            } catch (SQLException s) {
                s.printStackTrace();
            }
            
            return iID;
        }

        /**
         * Consulta por todos os trabalhos cadastrados do autor que tenha o email passado no parâmetro
         * @param aEmail Email do autor ao qual se deseja saber os seus trabalhos
         * @return Retorna uma lista contento os id's do trabalhos do autor em questão
         */
        public ArrayList consultarIdTodosTrabalhos(String aEmail){
            ArrayList<Integer> lista = new ArrayList<Integer>();
            ResultSet rs = null;
            
            String sQuery = "select idTrabalho from submissao.autortrabalho where emailPesquisador ='"+aEmail+"';";
            try{
                statement.execute(sQuery);
                rs = statement.getResultSet();

                while(rs.next()){
                    lista.add(rs.getInt("idTrabalho"));
                }
                rs.close();

            }catch(SQLException s){
                s.printStackTrace();
            }
            
            return lista;



        }
    
}
